package com.example.mysql.学习笔记.高级.事务.锁;

public class 锁结构 {
}
/**
 * 4.锁的内存结构
 * 我们前边说对一条记录加锁的本质就是在内存中创建一个锁结构与之关联，
 * 那么是不是一个事务对多条记录加锁，就要创建多个锁结构呢?比如:
 * SELECT *  FROM 表名 LOCK IN SHARE MODE ;
 * 理论上创建多个锁结构没问题，但是如果一个事务要获取10000条记录的锁，
 * 生成10000个锁结构也太崩溃了!
 * 所以决定在对不同记录加锁时，如果符合下边这些条件的记录会放到一个锁结构中。
 * ●在同一个事务中进行加锁操作
 * ●被加锁的记录在同一个页面中
 * ●加锁的类型是一-样的
 * ●等待状态是一样的
 *
 * InnoDB存储引擎中的锁结构如下:
 * 结构解析:
 * 1.锁所在的事务信息:  只是一个指针，指向事务信息位置
 * 不论是表锁还是行锁，都是在事务执行过程中生成的，
 * 哪个事务生成了这个锁结构，这里就记录这个事务的信息。
 * 2.索引信息:
 * 对于行锁来说，需要记录一下加锁的记录是属于哪个索引的。这里也是一个指针。
 * 3.表锁/行锁信息:  表锁结构和行锁结构在这个位置的内容是不同的:
 * ●表锁:   记载着是对哪个表加的锁，还有其他的一些信息
 * ●行锁:  记载了三个重要的信息:
 *    Space ID:记录所在表空间。
 *    Page Number :记录所在页号。
 *    n_bits:对于行锁来说，一条记录就对应着一个比特位，
 *    一个页面中包含很多记录，用不同的比特位来区分到底是哪一条记录加了锁。
 *    为此在行锁结构的末尾放置了一堆比特位,这个n_bits 属性代表使用了多少比特位。
 *        n_bits的值一般都比页面中记录条数多-些。
 *        主要是为了之后在页面中插入了新记录后也不至于重新分配锁结构
 * 4. type_mode :
 *  这是一个32位的数，被分成了lock_mode、lock_type 和rec_lock_type 三个部分,
 *
 *   ●锁的模式(lock_mode)，占用 低4位,可选的值如下:
 *     。LOCK_IS (十进制的0) :表示共享意向锁，也就是IS锁。
 *     。LOCK_IX (十进制的1) :表示独占意向锁，也就是IX锁。
 *     。LOCK_S (十进制的2) :表示共享锁，也就是S锁。
 *     。LOCK_X (十进制的3) :表示独占锁，也就是X锁。
 *     。LOCK_AUTO_INC (十进制的4) :表示AUTO_INC锁。
 *   ●锁的类型(lock_type) ，占用第5 ~ 8位，不过现阶段只有第5位和第6位被使用:
 *      。LOCK_TABLE (十进制的16) ，也就是当第5个比特位置为1时,表示表级锁。
 *      。LOCK_REC (十进制的32) ;也就是当第6个比特位置为1时，表示行级锁。
 *   ●行锁的具体类型( rec_1ock_type) ，使用其余的位来表示。
 *    只有在lock_type的值为LOCK_REC时，也就是只有在该锁为
 *    行级锁时，才会被细分为更多的类型:
 *       。LOCK_ORDINARY (十进制的0) :表示next-key锁。
 *       。LOCK_GAP (十进制的512) :也就是当第10个比特位置为1时，表示gap锁（间隙锁）。
 *       。LOCK_REC_NOT_GAP (十进制的1024) :也就是当第11个比特位置为1时，表示正经记录锁
 *       。LOCK_INSERT_INTENTION (十进制的2048) :也就是当第12个比特位置为1时，表示插入意向锁。
 *       其他的类型:还有一些不常用的类型我们就不多说了。
 * ●is_waiting属性呢?基于内存空间的节省，
 * 所以把is_ waiting属性放到了type_mode这个32位的数字中:
 *     。LOCK_WAIT (十进制的256) :
 *     当第9个比特位置为1时，表示is_waiting为true，也就是当前事务尚未获取到锁，处在等待状态;.
 *     当这个比特位为0时，表示is_waiting为false，也就是当前事务获取锁成功。
 * 5.其他信息:
 * 为了更好的管理系统运行过程中生成的各种锁结构而设计了各种哈希表和链表。
 * 6.一堆比特位:  记录那些信息锁那些信息不锁   如100条记录 用100位bit表示  1表示锁了
 * 如果是行锁结构的话，在该结构末尾还放置了-堆比特位,比特位的数量是由上边提到的n_bits属性表示的。
 *
 */
